package ucla.axelia.vista;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import ucla.axelia.controlador.interfaces.IServicioAdministracionAsignarVoluntariosActividadPlanificada;
import ucla.axelia.modelo.beans.Nacionalidad;
import ucla.axelia.modelo.data.ActividadPlanificada;
import ucla.axelia.modelo.data.Pais;
import ucla.axelia.modelo.data.Voluntario;
import ucla.axelia.vista.componentes.ComponenteHorario;

import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.CheckBox;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.layout.GridLayoutData;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.ContenedorBusqueda;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.controles.Grid;
import com.obelisco.vista.controles.Label;
import com.obelisco.vista.controles.SelectField;
import com.obelisco.vista.controles.TextField;
import com.obelisco.vista.plantillas.VentanaBase;

public class ContenedorBusquedaVoluntariosActividadPlanificada extends ContenedorBusqueda implements ComponenteDatosListener {
	 
	private IServicioAdministracionAsignarVoluntariosActividadPlanificada servicioAdministracionAsignarVoluntariosActividadPlanificada;
	private List<Pais> paises;
	private Pais paisVenezuela;
	
	private TextField txtCodigo;
	private SelectField cmbNacionalidad;
	private TextField txtCedula;
	private TextField txtNombre;
	private TextField txtApellido;
	private SelectField cmbPaises;	
	private SelectField cmbPrograma;
	private CheckBox chkFiltrarPerfil;
	private CheckBox chkFiltrarHorario;

	private ActividadPlanificada actividadPlanificada;
	private PanePerfilActividad panPerfilActividad;
	private ComponenteHorario horarioActividadPlanificada;

	private ActionListener cmbNacionalidadListener = new  ActionListener() {
		public void actionPerformed(ActionEvent Arg) {
			paises.remove(paisVenezuela);
			boolean esExtranjero = false;
			boolean esVenezolano = false;
			if (cmbNacionalidad.getSelectedItem() != null) {
				esExtranjero = ((Nacionalidad)cmbNacionalidad.getSelectedItem()).getId().equals(Nacionalidad.EXTRANJERO);
				esVenezolano = ((Nacionalidad)cmbNacionalidad.getSelectedItem()).getId().equals(Nacionalidad.VENEZOLANO);
			}
			if (!esExtranjero)
				paises.add(paisVenezuela);
			cmbPaises.inicializarDatos(paises, "nombre", "idpais");			  
			if (esVenezolano)
				cmbPaises.setSelectedItem(paisVenezuela);			
			cmbPaises.setEnabled(!esVenezolano);
		}
	};
	
	private PanePerfilActividad configurarSegundoTab() {
		TabPaneLayoutData tabPaneLayoutData = new TabPaneLayoutData();
		tabPaneLayoutData.setTitle("Perfil de la Actividad");
		this.panPerfilActividad.setLayoutData(tabPaneLayoutData);	
		this.panPerfilActividad.onObjetoEntidad(this.actividadPlanificada.getActividad());
		this.panPerfilActividad.onConsultar(this.actividadPlanificada.getActividad());
		return this.panPerfilActividad;
	}
	
	private ComponenteHorario configurarTercerTab() {
		TabPaneLayoutData tabPaneLayoutData = new TabPaneLayoutData();
		tabPaneLayoutData.setTitle("Horario de la Actividad");
		this.horarioActividadPlanificada.setLayoutData(tabPaneLayoutData);
		this.horarioActividadPlanificada.inicializar();
		this.horarioActividadPlanificada.setHorario(this.actividadPlanificada.getHorarioActividadPlanificadas());
		this.horarioActividadPlanificada.setEnabled(false);
		return this.horarioActividadPlanificada;
	}
	
	private ActionListener chkFiltrarListener = new ActionListener() {

		public void actionPerformed(ActionEvent arg0) {
			for (int i=((VentanaBase)ventanaPadre).getAreaTrabajo().getComponentCount()-1; i>0; i--) {
				((VentanaBase)ventanaPadre).getAreaTrabajo().remove(i);
			}
			if (chkFiltrarPerfil.isSelected()) {
				int proximaPosicion = ((VentanaBase)ventanaPadre).getAreaTrabajo().getComponentCount();
				((VentanaBase)ventanaPadre).getAreaTrabajo().add(panPerfilActividad, proximaPosicion);				
			}
			if (chkFiltrarHorario.isSelected()) {
				int proximaPosicion = ((VentanaBase)ventanaPadre).getAreaTrabajo().getComponentCount();
				((VentanaBase)ventanaPadre).getAreaTrabajo().add(horarioActividadPlanificada, proximaPosicion);
			}
		}		
	};
	
	private void configurarPrimerTab() {
		this.removeAll();		
		
		Grid grdBusqueda = new Grid();
		grdBusqueda.setWidth(new Extent(100, Extent.PERCENT));
		grdBusqueda.setStyleName("Obelisco.GridPaneDialogo");
		grdBusqueda.setSize(4);		
		grdBusqueda.setColumnWidth(0,new Extent(15,Extent.PERCENT));
		grdBusqueda.setColumnWidth(1,new Extent(35,Extent.PERCENT));
		grdBusqueda.setColumnWidth(2,new Extent(15,Extent.PERCENT));		
		this.add(grdBusqueda);
		
		chkFiltrarPerfil = new CheckBox("Filtrar por Perfil de la Actividad");
		chkFiltrarPerfil.addActionListener(this.chkFiltrarListener);
		GridLayoutData gridLayout1por2Centro = new GridLayoutData();
		gridLayout1por2Centro.setAlignment(new Alignment(Alignment.LEFT, Alignment.CENTER));
		gridLayout1por2Centro.setColumnSpan(2); 
		chkFiltrarPerfil.setLayoutData(gridLayout1por2Centro);
		grdBusqueda.add(chkFiltrarPerfil);			
		
		chkFiltrarHorario = new CheckBox("Filtrar por Horario de la Actividad");
		chkFiltrarHorario.addActionListener(this.chkFiltrarListener);
		chkFiltrarHorario.setLayoutData(gridLayout1por2Centro);
		grdBusqueda.add(chkFiltrarHorario);
		
		Label lbCedulaVoluntario = new Label("Cedula");
		grdBusqueda.add(lbCedulaVoluntario);
		Row rowAux = new Row();
		rowAux.setCellSpacing(new Extent (10, Extent.PX));
		cmbNacionalidad  = new SelectField(80);	
		cmbNacionalidad.addActionListener(this.cmbNacionalidadListener);
		rowAux.add(cmbNacionalidad);
		txtCedula = new TextField(100);
		txtCedula.setMaximumLength(8);
		rowAux.add(txtCedula);
		grdBusqueda.add(rowAux);
		
		Label lbNacionalidadVoluntario = new Label("Nacionalidad");
		grdBusqueda.add(lbNacionalidadVoluntario);
		cmbPaises = new SelectField(150);
		grdBusqueda.add(cmbPaises);
		
		Label lbNombreVoluntario = new Label("Nombre");
		grdBusqueda.add(lbNombreVoluntario);
		txtNombre = new TextField(190);
		txtNombre.setMaximumLength(50);
		grdBusqueda.add(txtNombre);
		
		Label lbApellidoVoluntario = new Label("Apellido");
		grdBusqueda.add(lbApellidoVoluntario);		
		txtApellido = new TextField(190);
		txtApellido.setMaximumLength(50);
		grdBusqueda.add(txtApellido);
		
		Label lbCodigoVoluntario = new Label("Codigo");
		grdBusqueda.add(lbCodigoVoluntario);		
		txtCodigo = new TextField(100);
		txtCodigo.setMaximumLength(8);
		grdBusqueda.add(txtCodigo);
		
		Label lblPrograma = new Label("Programa");
		grdBusqueda.add(lblPrograma);
		cmbPrograma = new SelectField(120);
		cmbPrograma.setNombreItemDefecto("Cualquiera");
		cmbPrograma.inicializarDatos(servicioAdministracionAsignarVoluntariosActividadPlanificada.buscarProgramas(), "nombrePrograma", "idPrograma");
		grdBusqueda.add(cmbPrograma);
	}
	
	private Component ventanaPadre = null;
	private void initComponents() {
		this.configurarPrimerTab();
		if(ventanaPadre == null) {
			ventanaPadre = this.getParent();
			while (!(ventanaPadre instanceof VentanaBase)) {
				ventanaPadre = ventanaPadre.getParent();
			}
		}
		((VentanaBase)ventanaPadre).getAreaTrabajo().add(this.configurarSegundoTab());
		((VentanaBase)ventanaPadre).getAreaTrabajo().add(this.configurarTercerTab());
	}

	@Override
	public void inicializar() {
		// TODO Auto-generated method stub
		initComponents();
		
		cmbNacionalidad.setNombreItemDefecto("Cualquiera");
		cmbNacionalidad.inicializarDatos(Nacionalidad.getNacionalidades(), "id", "id");
		cmbNacionalidad.setSelectedItemPorId(Nacionalidad.VENEZOLANO);		
		paises = servicioAdministracionAsignarVoluntariosActividadPlanificada.buscarPaises();
		cmbPaises.setNombreItemDefecto("Cualquiera");
        cmbPaises.inicializarDatos(this.paises, "nombre", "idpais");
        paisVenezuela = this.servicioAdministracionAsignarVoluntariosActividadPlanificada.buscarPaisPorId(Pais.ID_PAIS_VENEZUELA);
        cmbPaises.setSelectedItem(paisVenezuela);
        cmbPaises.setEnabled(false);
		chkFiltrarPerfil.setSelected(true);
		chkFiltrarHorario.setSelected(true);
	}

	@Override
	public List realizarBusqueda() {
		Map<String, Object> criterios = new HashMap();
		if (!txtCodigo.getText().trim().equals(""))
			criterios.put("codigoVoluntario", txtCodigo.getText().trim());		
		if (cmbNacionalidad.getSelectedItem() != null)
			criterios.put("nacionalidadVoluntario", ((Nacionalidad)cmbNacionalidad.getSelectedItem()).getId().toString());
		if (!(txtCedula.getText().trim()).equals(""))
			criterios.put("cedulaVoluntario", (txtCedula.getText().trim()));
		if (cmbPaises.getSelectedItem() != null) {
			Pais pais = (Pais) cmbPaises.getSelectedItem();
			criterios.put("pais.idpais", pais.getIdpais().toString());
		}
		if (!txtNombre.getText().trim().equals(""))
			criterios.put("nombreVoluntario", txtNombre.getText().trim());
		if (!txtApellido.getText().trim().equals(""))
			criterios.put("apellidoVoluntario", txtApellido.getText().trim());
		if (cmbPrograma.getSelectedItem() != null)
			criterios.put("programaActual", cmbPrograma.getSelectedItem());
		
		List<Voluntario> voluntarios = new ArrayList<Voluntario>();
		if ((chkFiltrarPerfil.isSelected()) && 
			(chkFiltrarHorario.isSelected())){
			voluntarios = this.servicioAdministracionAsignarVoluntariosActividadPlanificada.buscarVoluntariosPorPerfilYHorarioActividad(criterios, this.actividadPlanificada);			
		}
		else if (chkFiltrarPerfil.isSelected()) {
			voluntarios = this.servicioAdministracionAsignarVoluntariosActividadPlanificada.buscarVoluntariosPorPerfilActividad(criterios, this.actividadPlanificada.getActividad());
		}
		else if (chkFiltrarHorario.isSelected()) {
			voluntarios = this.servicioAdministracionAsignarVoluntariosActividadPlanificada.buscarVoluntariosPorHorarioActividad(criterios, this.actividadPlanificada);
		}
		else{
			voluntarios = this.servicioAdministracionAsignarVoluntariosActividadPlanificada.buscarVoluntariosPorCriterios(criterios);			
		}
		return voluntarios;
	}
		
	public void onCancelar() {
		// TODO Auto-generated method stub
		
	}

	public void onConfirmarCambios(Object objeto, TipoFuncion tipo, String nombre) {
		// TODO Auto-generated method stub

	}

	public void onConfirmarEliminacion(Object object) {
		// TODO Auto-generated method stub
		
	}

	public void onConsultar(Object objeto) {
	}

	public void onCrear() {
	}

	public void onFuncionPersonalizada(Object objeto, TipoFuncion funcion, String nombre) {
	}

	public void onIncluir(Object objeto) {
	}

	public void onInicializar() {
	}

	public void onListaParametros(List listaParametros) {
		this.actividadPlanificada = (ActividadPlanificada)listaParametros.get(0);
	}

	public void onModificar(Object objeto) {
	}

	public void onObjetoEntidad(Object objeto) {
	}

	public boolean onValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {
		return true;
	}

	
	// Getter y Setter
	public IServicioAdministracionAsignarVoluntariosActividadPlanificada getServicioAdministracionAsignarVoluntariosActividadPlanificada() {
		return servicioAdministracionAsignarVoluntariosActividadPlanificada;
	}

	public void setServicioAdministracionAsignarVoluntariosActividadPlanificada(
			IServicioAdministracionAsignarVoluntariosActividadPlanificada servicioAdministracionAsignarVoluntariosActividadPlanificada) {
		this.servicioAdministracionAsignarVoluntariosActividadPlanificada = servicioAdministracionAsignarVoluntariosActividadPlanificada;
	}

	public PanePerfilActividad getPanPerfilActividad() {
		return panPerfilActividad;
	}

	public void setPanPerfilActividad(PanePerfilActividad panPerfilActividad) {
		this.panPerfilActividad = panPerfilActividad;
		this.panPerfilActividad.onInicializar();
	}

	public ComponenteHorario getHorarioActividadPlanificada() {
		return horarioActividadPlanificada;
	}

	public void setHorarioActividadPlanificada(
			ComponenteHorario horarioActividadPlanificada) {
		this.horarioActividadPlanificada = horarioActividadPlanificada;
	}

}